package org.apli.haiam.admin.jsf.report;

import com.apli.controladores.AplinfoFactoryBean;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.ResourceBundle;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.SelectItem;
import org.apli.haiam.ejb.entidades.CexConsulta;
import org.apli.haiam.ejb.entidades.CexGeriatricoConsulta;
import org.apli.haiam.ejb.entidades.CexHistoriaClinica;
import org.apli.haiam.ejb.entidades.CexSindromeGeriatrico;
import org.apli.haiam.ejb.interfaces.AdministradorHaiam;
import org.apli.haiam.ejb.interfaces.ConsExternaAdministrador;
import org.apli.jsf.managed.JsfBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Clase backing Bean que administra la entidad CexConsulta.
 * <p>
 * <H6>Soporte:HAIAM
 * <I>david_s_1086@hotmail.com,david.carranza@haiam.gob.ec</I></H6>
 *
 * @author david Carranza
 * @version 1.0 30/07/2014
 */
@ManagedBean
@ViewScoped
public class JsfReporteConsulta extends JsfBean<CexConsulta> {
    
    final Logger log = LoggerFactory.getLogger(JsfReporteConsulta.class);
    protected ConsExternaAdministrador adminConsExt;
    private int tipoBusqueda;
    private Date fechaInicio;
    private Date fechaFin;
    private String parametroBusqueda;
    private CexHistoriaClinica cexHistoriaClinica;
    private List<CexSindromeGeriatrico> listaGeriatricoHistorial;
    private static final String NAME_REPORTE = "RPT_PRODUCCION_HC.jasper";
    private static final String NAME_REPORTE_HC = "RPT_LISTADO_HC.jasper";
    private static final String TIPO_REPORTE_PDF = "application/pdf";
    private static final String TIPO_REPORTE_XLS = "application/vnd.ms-excel";

    /**
     * Constructor por defecto.
     */
    public JsfReporteConsulta() {
    }

    /**
     * Inicializa los datos miembros.
     */
    @Override
    protected void inicializar() {
        //setSwGrabar(false);
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        object = new CexConsulta();
        tipoBusqueda = 1;
        fechaInicio = new Date();
        fechaFin = new Date();
        parametroBusqueda = "";
        cexHistoriaClinica = new CexHistoriaClinica();
        listaGeriatricoHistorial = new ArrayList<>();
        try {
            listaGeriatricoHistorial = adminObject.listar(CexSindromeGeriatrico.class, "csgTipoPregunta", 0, "csgEstado", 1);
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }

        //listaProduccionHc = new ArrayList
    }

    /**
     * Obtiene el objeto remoto.
     */
    @Override
    protected void cargarEjb() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        if (adminConsExt == null) {
            String ejbPath = null;
            try {
                ResourceBundle property = getProperties();
                String ORBContext = property.getString("ORBContext");
                String ejbContextPath = property.getString("ejb.context.path.ConsExterna");
                ejbPath = ORBContext + ejbContextPath + "/ConsExternaAdministradorBean";
                adminConsExt = (ConsExternaAdministrador) AplinfoFactoryBean.lookupBean(ejbPath, false);
            } catch (Exception e) {
                log.error("{}: {} - {} ", new Object[]{nombreMetodo, ejbPath, e});
            }
        }
        if (adminObject == null) {
            String ejbPath = null;
            try {
                ResourceBundle property = getProperties();
                String ORBContext = property.getString("ORBContext");
                String ejbContextPath = property.getString("ejb.context.path.admin");
                ejbPath = ORBContext + ejbContextPath + "/AdministradorBeanHaiam";
                adminObject = (AdministradorHaiam) AplinfoFactoryBean.lookupBean(ejbPath, false);
            } catch (Exception e) {
                log.error("{}: {} - {} ", new Object[]{nombreMetodo, ejbPath, e});
            }
        }
    }

    /**
     * Graba el registro asociado al objeto que se administra en la página.
     *
     * @return null, se mantiene en la página invocada.
     */
    @Override
    public String grabarAction() {
        FacesContext context = FacesContext.getCurrentInstance();
////////////        object.setCpuNombre(object.getCpuNombre().toUpperCase());
////////////        if (object.getCpuId() == null) {
////////////
////////////            try {
////////////                if (!admin.existePorCampo(object.getClass(), "cpuNombre", object.getCpuNombre())) {
////////////                    admin.crear(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
////////////                    inicializar();
////////////                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.grabar")));
////////////                } else {
////////////                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error!", bundle.getString("msg.nombre.duplicado")));
////////////                }
////////////            } catch (Exception e) {
////////////                log.error("grabarAction() {} ", e.getMessage());
////////////                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
////////////            }
////////////        } else {
////////////            try {
////////////                admin.modificar(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
////////////                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.actualizar")));
////////////            } catch (Exception e) {
////////////                log.error("grabarAction() {} ", e.getMessage());
////////////                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
////////////            }
////////////        }
////////////        cargarLista();
        return null;
    }

    /**
     * Carga la lista de objetos en una lista de la página.
     */
    @Override
    public void cargarLista() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        if (admin == null) {
            lista = null;
            return;
        }
        try {
            
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Metodo que busca una historia clinica
     *
     *
     * @author David Carranza
     */
    public void buscarHistorial() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            parametroBusqueda = parametroBusqueda.trim();
            if (parametroBusqueda.equals("")) {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "valorBusqueda").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Valor nullo no permitido", "Ingrese parametro de busqueda"));
                
            } else {
                if (tipoBusqueda == 1) {
                    if (admin.existePorCampo(CexHistoriaClinica.class, "chcHistoriaClinica", parametroBusqueda)) {
                        cexHistoriaClinica = (CexHistoriaClinica) adminObject.buscar(CexHistoriaClinica.class, "chcHistoriaClinica", parametroBusqueda);
                        if (cexHistoriaClinica != null) {
                            lista = adminObject.listarOrdenada(object.getClass(), "cexPreparacion.cexAgenda.cexHistoriaClinica.chcHistoriaClinica", parametroBusqueda, "cexPreparacion.cexAgenda.cagFecha", false);
                        }
                        parametroBusqueda = "";
                    } else {
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Busqueda sin resultados", "No se encontro paciente"));
                    }
                }
                
                if (tipoBusqueda == 2) {
                    if (admin.existePorCampo(CexHistoriaClinica.class, "chcCedula", parametroBusqueda)) {
                        cexHistoriaClinica = (CexHistoriaClinica) admin.buscar(CexHistoriaClinica.class, "chcCedula", parametroBusqueda);
                        if (cexHistoriaClinica != null) {
                            lista = adminObject.listarOrdenada(object.getClass(), "cexPreparacion.cexAgenda.cexHistoriaClinica.chcCedula", parametroBusqueda, "cexPreparacion.cexAgenda.cagFecha", false);
                        }
                        parametroBusqueda = "";
                    } else {
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Busqueda sin resultados", "No se encontro paciente"));
                    }
                } else if (tipoBusqueda == 3) {
                    if (admin.existePorCampo(CexHistoriaClinica.class, "chcPasaporte", parametroBusqueda)) {
                        cexHistoriaClinica = (CexHistoriaClinica) admin.buscar(CexHistoriaClinica.class, "chcPasaporte", parametroBusqueda);
                        if (cexHistoriaClinica != null) {
                            lista = adminObject.listarOrdenada(object.getClass(), "cexPreparacion.cexAgenda.cexHistoriaClinica.chcPasaporte", parametroBusqueda, "cexPreparacion.cexAgenda.cagFecha", false);
                        }
                        parametroBusqueda = "";
                    } else {
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Busqueda sin resultados", "No se encontro paciente"));
                    }
                }
            }
            
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Obtiene una lista de objetos de tipo SelectedItem.
     *
     * @return la lista
     */
    @Override
    public List<SelectItem> getSelectedItem() {
        try {
//////////            List<CexPueblo> datosS = admin.listarOrdenada(object.getClass(), "cpuNombre", true);
//////////            // datos = admin.listarNullOrdenada(object.getClass(), "cexEspecialidad","espEstado",1, "espNombre", true);
            List<SelectItem> items = new ArrayList<>();
//////////            for (CexPueblo obj : datosS) {
//////////                items.add(new SelectItem(obj, obj.getCpuNombre()));
//////////            }
            return items;
        } catch (Exception e) {
            log.error("getSelectedItem() {} ", e.getMessage());
        }
        return null;
    }
    
    @Override
    public String editarAction(CexConsulta obj) {
        inicializar();
        object = obj;
        cargarEscalaGeriatrica(obj);
        return null;
    }

    /**
     * Carga la escala geriatrica de acuerdo a la consulta seleccionada.
     *
     * @param obj
     */
    public void cargarEscalaGeriatrica(CexConsulta obj) {
        //inicializar();
        try {
            for (CexSindromeGeriatrico objSin : listaGeriatricoHistorial) {
                objSin.setTotal(0);
                for (CexSindromeGeriatrico objTen : objSin.getCexSindromeGeriatricoList()) {
                    for (CexGeriatricoConsulta cexGc : obj.getCexGeriatricoConsultaList()) {
                        if (cexGc.getCexSindromeGeriatrico().equals(objTen)) {
                            objTen.setValorRespuesta(cexGc.getCgcRespuesta());
                            
                        }
                    }
                    objSin.setTotal(objSin.getTotal() + objTen.getValorRespuesta());
                }
            }
        } catch (Exception e) {
            log.error("{}: {} ", "cargarEscalaGeriatrica", e);
        }
        
    }
    
    @Override
    public DataModel<CexConsulta> getDataModel() {
        return null;
    }
    
    @Override
    protected ResourceBundle getProperties() {
        return ResourceBundle.getBundle("aplicacion");
    }
    
    public int getTipoBusqueda() {
        return tipoBusqueda;
    }
    
    public void setTipoBusqueda(int tipoBusqueda) {
        this.tipoBusqueda = tipoBusqueda;
    }
    
    public Date getFechaInicio() {
        return fechaInicio;
    }
    
    public void setFechaInicio(Date fechaInicio) {
        this.fechaInicio = fechaInicio;
    }
    
    public Date getFechaFin() {
        return fechaFin;
    }
    
    public void setFechaFin(Date fechaFin) {
        this.fechaFin = fechaFin;
    }
    
    public String getParametroBusqueda() {
        return parametroBusqueda;
    }
    
    public void setParametroBusqueda(String parametroBusqueda) {
        this.parametroBusqueda = parametroBusqueda;
    }
    
    public CexHistoriaClinica getCexHistoriaClinica() {
        return cexHistoriaClinica;
    }
    
    public void setCexHistoriaClinica(CexHistoriaClinica cexHistoriaClinica) {
        this.cexHistoriaClinica = cexHistoriaClinica;
    }
    
    public List<CexSindromeGeriatrico> getListaGeriatricoHistorial() {
        return listaGeriatricoHistorial;
    }
    
    public void setListaGeriatricoHistorial(List<CexSindromeGeriatrico> listaGeriatricoHistorial) {
        this.listaGeriatricoHistorial = listaGeriatricoHistorial;
    }
    
}
